﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using NUnit.Framework;
using Studio7i.Dominio;
using Studio7i.Persistencia;


namespace Studio7i.Pruebas
{
    public class TestReservaInstrumentoDAO
    {

        [TestFixture]
        public class Test1_ReservaInstrumentoDAO
        {
            // Atributos a utilizar durante las pruebas
            private ReservaInstrumentoDAO reservaInstrumentoDAO = null;
            private int codigoGenerado = 0;

            [TestFixtureSetUp]
            public void PrepararPruebas()
            {
                // 1. Definimos la implementación del DAO a probar (ADO / NH / EF)
                reservaInstrumentoDAO = new Persistencia.ReservaInstrumentoDAO();

                 //2. Eliminamos todos los cientes en BD antes de las pruebas
                foreach (ReservaInstrumento reservaInstrumento in reservaInstrumentoDAO.ListarTodos())
                    reservaInstrumentoDAO.Eliminar(reservaInstrumento);

                // 3. Creamos 3 clientes para tenerlos disponibles en las pruebas
                reservaInstrumentoDAO.Crear(new ReservaInstrumento(1, 1, 1));
                reservaInstrumentoDAO.Crear(new ReservaInstrumento() { Codigo = 2, CodReserva = 2, CodInstrumento = 1 });
                

            }
            [Test]
            public void Test1_Crear()
            {
                // 1. Clase a probar: ReservaInstrumentoDAO
                Assert.IsNotNull(reservaInstrumentoDAO);

                // 2. Declaramos e instanciamos la entidad de dominio
                ReservaInstrumento reservaInstrumentoACrear = new ReservaInstrumento();
                //reservaInstrumentoACrear.Codigo = 1;
                reservaInstrumentoACrear.CodReserva = 2;
                reservaInstrumentoACrear.CodInstrumento = 1;

                // 3. Declaramos la entidad que contendrá el resultado
                ReservaInstrumento reservaInstrumentoCreado = null;

                // 4. Probamos que no ocurra error al ejecutar el método
                Assert.DoesNotThrow(delegate
                {
                    // 5. Ejecutamos el método a probar
                    reservaInstrumentoCreado = reservaInstrumentoDAO.Crear(reservaInstrumentoACrear);
                    codigoGenerado = reservaInstrumentoCreado.Codigo;
                }, "Reserva-Instrumento creada");

                // Probamos que la entidad resultante no sea nula
                Assert.IsNotNull(reservaInstrumentoCreado);
                // Probamos que el código generado sea mayor a 0
                Assert.Greater(reservaInstrumentoCreado.Codigo, 0);

                // Probamos que el nombre registrado es igual al solicitado con la entidad
                Assert.AreEqual(reservaInstrumentoCreado.CodReserva, reservaInstrumentoACrear.CodReserva);
                Assert.AreEqual(reservaInstrumentoCreado.CodInstrumento, reservaInstrumentoACrear.CodInstrumento);

            }

            [Test]
            public void Test2_Obtener()
            {
                // 1. Clase a probar: ReservaInstrumentoDAO
                Assert.IsNotNull(reservaInstrumentoDAO);
                // 2. Definimos los datos para la prueba
                int codigo = 1;
                // 3. Declaramos la entidad que contendrá el resultado
                ReservaInstrumento reservaInstrumentoObtenido = null;
                // 4. Probamos que no ocurra error al ejecutar el método
                Assert.DoesNotThrow(delegate
                {
                    // 5. Ejecutamos el método a probar
                    reservaInstrumentoObtenido = reservaInstrumentoDAO.Obtener(codigo);
                });

                // Probamos que la entidad resultante no sea nula
                Assert.IsNotNull(reservaInstrumentoObtenido);
                Assert.AreEqual(reservaInstrumentoObtenido.Codigo, codigo);


            }

            [Test]
            public void Test3_Modificar()
            {
                // 1. Clase a probar: ReservaInstrumentoDAO
                Assert.IsNotNull(reservaInstrumentoDAO);

                // 2. Declaramos e instanciamos la entidad de dominio a modificar
                ReservaInstrumento reservaInstrumentoAModificar = new ReservaInstrumento();
                reservaInstrumentoAModificar.Codigo = 2;
                reservaInstrumentoAModificar.CodReserva = 2;
                reservaInstrumentoAModificar.CodInstrumento = 2;


                // 3. Declaramos la entidad que contendrá el resultado
                ReservaInstrumento reservaInstrumentoModifica = null;

                // 4. Probamos que no ocurra error al ejecutar el método
                Assert.DoesNotThrow(delegate
                {
                    // 5. Ejecutamos el método a probar
                    reservaInstrumentoModifica = reservaInstrumentoDAO.Modificar(reservaInstrumentoAModificar);
                }, "reservaInstrumento modificado");
                // Probamos que la entidad resultante no sea nula
                Assert.IsNotNull(reservaInstrumentoModifica);
                // Probamos que el código generado sea mayor a 0
                Assert.Greater(reservaInstrumentoModifica.Codigo, 0);
                // Probamos que el nombre registrado es igual al solicitado con la entidad
                Assert.AreEqual(reservaInstrumentoModifica.CodReserva, reservaInstrumentoAModificar.CodReserva);
                Assert.AreEqual(reservaInstrumentoModifica.CodInstrumento, reservaInstrumentoAModificar.CodInstrumento);

            }

            [Test]
            public void Test4_Eliminar()
            {
                // 1. Clase a probar: ReservaInstrumentoDAO
                Assert.IsNotNull(reservaInstrumentoDAO);

                // 2. Declaramos e instanciamos la entidad de dominio a eliminar
                codigoGenerado = 1;
                ReservaInstrumento reservaInstrumentoAEliminar = reservaInstrumentoDAO.Obtener(codigoGenerado);

                // 3. Declaramos la entidad que contendrá el resultado
                ReservaInstrumento reservaInstrumentoEliminada = null;

                // 4. Probamos que no ocurra error al ejecutar el método
                Assert.DoesNotThrow(delegate
                {
                    // 5. Ejecutamos el método a probar
                    reservaInstrumentoDAO.Eliminar(reservaInstrumentoAEliminar);
                }, "reservaInstrumento eliminado");

                // Probamos que la entidad resultante no sea nula
                Assert.IsNull(reservaInstrumentoEliminada);

            }
            [Test]
            public void Test5_ListarTodos()
            {
                // 1. Clase a probar: ReservaInstrumentoDAO
                Assert.IsNotNull(reservaInstrumentoDAO);
                // 2. Declaramos la entidad que contendrá el resultado
                ICollection<ReservaInstrumento> reservaInstrumentocEnontrados = null;
                // 3. Probamos que no ocurra error al ejecutar el método
                Assert.DoesNotThrow(delegate
                {
                    // 5. Ejecutamos el método a probar
                    reservaInstrumentocEnontrados = reservaInstrumentoDAO.ListarTodos();
                }, "ReservaInstrumentos Listados");

                // Probamos que la entidad resultante no sea nula
                Assert.IsNotNull(reservaInstrumentocEnontrados);

                // Probamos que la cantidad de instrumentos encontrados sea 1
                // Assert.AreEqual(reservaInstrumentocEnontrados.Count, 1);

                // Probamos que cada instrumento contenga la cadena de búsqueda en su nombre
                foreach (ReservaInstrumento reservaInstrumentoEnontrado in reservaInstrumentocEnontrados)
                {
                    Assert.IsNotNull(reservaInstrumentoEnontrado);
                    Assert.IsInstanceOf(typeof(ReservaInstrumento), reservaInstrumentoEnontrado);
                }
            }

        }   
    }
}